//轮转数组 给定一个整数数组 nums，将数组中的元素向右轮转 k 个位置，其中 k 是非负数。
//输入: nums = [1,2,3,4,5,6,7], k = 3
//输出: [5,6,7,1,2,3,4]
//解释:
//向右轮转 1 步: [7,1,2,3,4,5,6]
//向右轮转 2 步: [6,7,1,2,3,4,5]
//向右轮转 3 步: [5,6,7,1,2,3,4]
class Solution1 {
    /*使用三次逆转法，让数组旋转k次
    1. 整体逆置 
    2. 逆转子数组[0, k - 1]
    3. 逆转子数组[k, size - 1]
    */
    void roate(int[] nums,int left,int right){
        while(left<right){
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }
    }
    public void rotate(int[] nums,int k){
        k %= nums.length;
        roate(nums,0,nums.length-1);//1. 整体逆置 
        roate(nums,0,k-1);// 2. 逆转子数组[0, k - 1]
        roate(nums,k,nums.length-1);//3. 逆转子数组[k, size - 1]
         
    }
     

    /*进行k次旋转，每次旋转移动一个字符  （会超时）
    public void rotate(int[] nums,int k){
        k %= nums.length;
        for(int i = 0; i<k;++i){
            //数组中的前n-1个元素后移一位
            int last = nums[nums.length-1];
            for(int j = nums.length-1;j>=1;--j){
                nums[j] = nums[j-1];
            }
            //将数组的最后一个元素插到数组的0下标位置上，为第一个元素
            nums[0] = last;
        }
    }*/

    /*public void rotate(int[] nums, int k) {
        int n = nums.length;
        k %= n;
        int[] temp1 = new int[n - k];
        int[] temp2 = new int[k];
        System.arraycopy(nums, 0, temp1, 0, n - k);
        System.arraycopy(nums, n - k, temp2, 0, k);
        System.arraycopy(temp2, 0, nums, 0, k);
        System.arraycopy(temp1, 0, nums, k, n - k);
    }*/
}

